package modelo.juego;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;

import observadores.Observable;
import observadores.Observador;
import modelo.delictivas.ITrampa;
import modelo.delictivas.Ladron;
import modelo.delictivas.OrganizacionDelictiva;
import modelo.lugaresYPistas.IRespuesta;
import modelo.policiales.Interpol;
import modelo.policiales.Policia;

public class Juego extends Observable implements Observador{

	private Interpol interpol;
	private OrganizacionDelictiva organizacionDelictiva;
	private Policia jugadorActual;
	private boolean enJuego;

	public Juego(Interpol interpol, OrganizacionDelictiva organizacionDelictiva) {
		this.interpol = interpol;
		this.interpol.agregarObservador(this);
		this.organizacionDelictiva = organizacionDelictiva;
		this.interpol.setOrganizacionInvestigada(organizacionDelictiva);
		
		this.jugadorActual = null;
		this.iniciar();
	}

	public Interpol getInterpol() {
		return this.interpol;
	}

	public OrganizacionDelictiva getOrganizacionDelictiva() {
		return this.organizacionDelictiva;
	}

	public Policia getJugadorActual() {		
		return this.jugadorActual;
	}

	public boolean existeJugador(String nombre) {
		return this.interpol.existePolicia(nombre);
	}

	public void identificarJugador(String nombre) throws Exception {
		
		if(!this.existeJugador(nombre)) throw new Exception("No existe un jugador con ese nombre");
		
		this.jugadorActual = this.interpol.getPolicia(nombre);
	}

	public boolean enJuego() {
		return this.enJuego;
	}

	public void finalizarJuego() {
		this.enJuego = false;
	}

	public void crearJugador(String nombre) throws Exception {
		this.interpol.registrarNuevoPolicia(nombre);
		this.jugadorActual = interpol.getPolicia(nombre);
	}

	public void iniciar() {
		this.enJuego = true;
	}
	
	public String obtenerDatoInicial() {
		return this.jugadorActual.getInvestigacion().getRobo().getDatoInicial();
	}


	@Override
	public void actualizar() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void jugadorViaja() {
		this.notificarViaje();
	}

	@Override
	public void ladronEncontrado() {
		this.notificarLadronEncontrado();
		
	}

	@Override
	public void trampaActivada(ITrampa trampa) {
		this.notificarTrampa(trampa);
		
	}

	@Override
	public void ladronArrestado(){
		this.interpol.agregarArrestoAlHistorialDe(this.jugadorActual);
		this.notificarLadronArrestado();
	}

	@Override
	public void ladronEscapa() {
		this.notificarLadronEscapa();
	}

	@Override
	public void respuestaRecibida(IRespuesta respuesta) {
		this.notificarRespuestaRecibida(respuesta);
	}

	@Override
	public void ordenArrestoDenegada() {
		this.notificarOrdenDeArrestoDenegada();
		
	}

	@Override
	public void ordenArrestoObtenida(Ladron ladron) {
		this.notificarOrdenDeArrestoObtenida(ladron);
	}

	@Override
	public void policiaDuerme() {
		this.notificarPoliciaDuerme();
	}

	@Override
	public void ascensoDePolicia() {
		this.notificarAscenso();
	}

	@Override
	public void faltanAscensos(int arrestosFaltantes) {
		this.notificarFaltanArrestosParaAscenso(arrestosFaltantes);
	}

	@Override
	public void tiempoTerminado() {
		this.notificarTiempoTerminado();
	}

	public void guardar() throws ParserConfigurationException, TransformerException {
		this.interpol.guardar();
	}
}
